package com.doit.day03

import java.io.{FileOutputStream, ObjectOutputStream}
import scala.beans.BeanProperty

object _01_样例类 {
  def main(args: Array[String]): Unit = {
    val lion1 = new Lion1("辛巴", 2, "male")
    val lion3 = new Lion1("辛巴", 2, "male")
    println(lion1.equals(lion3))//com.doit.day03.Lion1@66d33a  false

    println(lion1.hashCode())//6738746
    println(lion3.hashCode())//2096171631

    val lion: Lion = new Lion("辛巴", 3, "male")
    val lion2: Lion = Lion("辛巴", 2, "male")


    println(lion2.equals(lion))//Lion(辛巴,2,male)  true

    println(lion2.hashCode())//1033169840
    println(lion.hashCode())//1033169840

//    val stream: ObjectOutputStream = new ObjectOutputStream(new FileOutputStream("d://abc.txt"))
//    stream.writeObject(lion2)

  }
}

//样例类里面，val定义属性可以不写
//他底层好像给我们做了一点别人不知道的事情
//比如说：好像底层给我们实现了伴生类和伴生对象==》 重写了apply方法，重写了unapply方法==》 可以实现模式匹配
//他还给我们实现了序列化接口
//还给我们写了toString方法
//还给我们重写了equals方法==》先比较类型，如果是同一个类型，再比较每一个属性的值
//还给我们重写了hashcode方法 ==》获取到每一个属性的hashcode
case class Lion(@BeanProperty
                 name:String,
                @BeanProperty
                var age:Int,
                gender:String)


class Lion1(name:String,var age:Int,gender:String){

}

object Lion2{
  val name:String = "辛巴"
}

